﻿using System.Collections.Generic;
using Centido.Core.Dto;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Centido.Core.Test
{
	/// <summary>
	///   Testing the data transfer object for domain options.
	/// </summary>
	[TestClass]
	public class DomainOptionsDtoTest : GenericDtoTest
	{
        /// <summary>
        ///   The current domain name.
        /// </summary>
        public const string DomainName = "FullAdminRights";

        /// <summary>
        ///   The current domain.
        /// </summary>
        private Domain _domain;


        /// <summary>
        /// Test initialiaze
        /// </summary>
        [TestInitialize]
        public void Initialize()
        {
            _domain = Domain.Build(DomainConfiguration.Load(DomainName));

            _domain.DeleteAll();
        }


        /// <summary>
        /// Test clean up
        /// </summary>
        [TestCleanup]
        public void CleanUp()
        {
            _domain.DeleteAll();
        }


	    /// <summary>
	    ///   Retrieves the name of the data transfer object xml tag.
	    /// </summary>
	    /// <returns></returns>
	    protected override string GetXmlTag()
	    {
            return DomainOptionsDto.XmlTag;
	    }


	    /// <summary>
	    ///   Retrives the current xml schema version.
	    /// </summary>
	    /// <returns></returns>
	    protected override string GetCurrentXmlSchemaVersion()
	    {
            return DomainOptionsDto.CurrentXmlSchemaVersion;
	    }


	    /// <summary>
	    ///   Creates a new data transfer object.
	    /// </summary>
	    /// <returns></returns>
	    protected override DataTransferObject CreateDto()
	    {
            return new DomainOptionsDto
            {
                HasRecycleBin = false
            };
	    }


	    /// <summary>
	    ///   Retrieves the list of data transfer object fields.
	    /// </summary>
	    /// <returns></returns>
	    protected override IEnumerable<DtoFieldInfo> GetFields()
	    {
            yield return new DtoFieldInfo
            {
                Name = "HasRecycleBin",
                XmlName = DomainOptionsDto.HasRecycleBinAttribute,
                IsRequired = false,
                FieldType = DtoFieldType.Boolean,
                SampleValue = false
            };
	    }


	    /// <summary>
	    ///   Copies the properties of the data transfer object to the corresponding object.
	    /// </summary>
	    /// <param name="dto">The data transfer object.</param>
	    /// <returns>Returns the corresponding object after copying.</returns>
	    protected override object CopyFrom(DataTransferObject dto)
	    {
            ((DomainOptionsDto)dto).CopyTo(_domain);

            return _domain;
	    }


	    /// <summary>
	    ///   Creates a data transfer object from the correpsonding object.
	    /// </summary>
	    /// <param name="dto">The created data transfer object.</param>
	    /// <param name="initialObject">The initial object.</param>
	    protected override void CreateDtoFromObject(out DataTransferObject dto, out object initialObject)
	    {
            dto = DomainOptionsDto.CreateFrom(_domain);
            initialObject = _domain;
	    }
	}
}
